package ibm.websphere.monitor.common;

import java.util.HashMap;
import java.util.List;

import ibm.websphere.monitor.exception.MonitorDaoException;
import ibm.websphere.monitor.page.PageResult;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.jdbc.Work;


/**
 * <pre>
 * @Description 通用数据库操作接口
 * </pre>
 *
 * @copyright www.timotai.net
 * @author 这家伙真懒
 * @date 2016-1-12
 */
public interface IDaoHelper<T> {


    /**
     * <pre>
     *  保存方法
     * </pre>
     *
     * @param obj 实体对象
     */
    public abstract void save(T obj);

    /**
     * <pre>
     * 更新方法
     * </pre>
     *
     * @param obj 实体对象
     */
    public abstract void update(T obj);

    /**
     * <pre>
     * 保存或更新方法
     * </pre>
     *
     * @param obj 实体对象
     */
    public abstract void saveOrUpdate(T obj);

    /**
     * <pre>
     * 删除指定的对象，该对象只包含主键即可
     * </pre>
     *
     * @param obj 实体对象
     */
    public abstract void delete(T obj);

    /**
     * <pre>
     * 	根据对象ID删除该对象
     * </pre>
     *
     * @param id
     */
    public abstract void delete(Long id);

    /**
     * <pre>
     * 	根据对象ID加载该对象
     * </pre>
     * <p/>
     * get/load 区别：
     * get 是查一次数据库，如果不存在，会返回NULL
     * load 是走缓存，如果不存在，会抛出ObjectNotFondException.
     *
     * @param id
     * @return
     */
    public abstract T load(Long id);

    /**
     * <pre>
     * 	根据对象ID加载该对象
     * </pre>
     *
     * @param id
     * @return
     */
    public abstract T get(Long id);


    public abstract List<T> find(String hql);

    /**
     * <pre>
     * 	根据实体名查询该对象的所有信息
     * </pre>
     *
     * @return
     */
    public abstract List<T> findAll();

    /**
     * 根据属性值进行查找
     *
     * @param propertyName
     * @param value
     * @return
     */
    public abstract List<T> findByProperty(String propertyName, Object value);

    /**
     * 根据属性值进行查找
     *
     * @param object
     * @return
     */
    public abstract List<T> findByExample(T object);


    public abstract T findOneByExample(T object);


    /**
     * 根据属性值进行查找一个对象，返回最先找到的一个
     *
     * @param propertyName
     * @param value
     * @return
     */
    public abstract T findOneByProperty(String propertyName, Object value);

    /**
     * <pre>
     *  根据实体名和条件查询该对象的所有信息
     * </pre>
     *
     * @param entityName 实体名
     * @param condition  查询的条件
     * @return
     */
    public abstract List<T> findByCondition(String entityName, String condition);


    /**
     * <pre>
     * 执行自定义sql时调用，需要实现Work接口。
     * </pre>
     */
    public abstract void doWork(Work w);


    /**
     * <pre>
     * 	根据条件查询出分页的内容
     * </pre>
     *
     * @param condition
     * @param offset
     * @param max
     * @return
     */
    public abstract List<T> findByCondition(final String condition,
                                            final int offset, final int max);


    /**
     * <pre>
     * 	根据条件查询出分页的内容
     * </pre>
     *
     * @param condition
     * @return
     */
    public abstract HashMap<String, Double> findNoByMonthSqlCount(
            final String condition);

    /**
     * <pre>
     * 	根据条件查询出分页的内容
     * </pre>
     *
     * @param condition
     * @return
     */
    public abstract int findBySqlCount(final String condition);

    /**
     * @param crits
     * @param order
     * @param offset
     * @param maxResults
     * @return
     * @throws MonitorDaoException
     */
    public abstract PageResult<T> findPageResult(
            final Criterion[] crits, final Order order, final int offset,
            final int maxResults) throws MonitorDaoException;


}